跳到主要内容

K8s 常见面试题

基础概念类面试题

1. 什么是 Kubernetes?它解决了什么问题?

考察点: 基础概念理解、容器编排意义

回答要点: Kubernetes(K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。

解决的核心问题:

  • 服务发现和负载均衡:自动分配流量到健康的 Pod
  • 存储编排:自动挂载存储系统
  • 自动部署和回滚:声明式更新应用
  • 自动装箱:根据资源需求优化容器部署
  • 自我修复:重启失败容器,替换不健康节点
  • 密钥和配置管理:安全存储和管理敏感信息

2. K8s 的核心组件有哪些?请画出架构图并说明各组件作用

考察点: 架构理解、组件职责

各组件作用:

Master 组件:

  • API Server:集群的前端,所有组件都通过它通信
  • etcd:分布式键值存储,保存集群状态
  • Scheduler:负责 Pod 调度到合适的 Node
  • Controller Manager:运行控制器,维护集群状态

Node 组件:

  • Kubelet:在每个节点上运行,管理 Pod 和容器
  • Kube-proxy:维护网络规则,实现服务抽象
  • Container Runtime:运行容器(Docker、containerd 等)

3. Pod 是什么?为什么 K8s 使用 Pod 而不直接使用容器?

考察点: 核心概念理解、设计思想

回答要点: Pod 是 K8s 中最小的可部署单元,包含一个或多个紧密耦合的容器。

使用 Pod 的原因:

  1. 共享网络:Pod 内容器共享同一个网络命名空间
  2. 共享存储:Pod 内容器可以共享 Volume
  3. 生命周期管理:容器作为一个整体进行调度和管理
  4. 原子性操作:Pod 内所有容器同时创建、启动、停止

工作负载类面试题

4. Deployment、StatefulSet、DaemonSet 的区别和使用场景?

考察点: 工作负载理解、适用场景判断

类型特点使用场景示例
Deployment无状态、可扩缩容、滚动更新Web 应用、API 服务Nginx、微服务
StatefulSet有状态、有序部署、持久化存储数据库、消息队列MySQL、Redis、Kafka
DaemonSet每个节点运行一个副本系统级服务、监控日志收集、监控 Agent

Deployment 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web
image: nginx:1.20
ports:
- containerPort: 80

5. 如何实现 Pod 的滚动更新?更新过程中如何保证服务不中断?

考察点: 部署策略、服务可用性

滚动更新时序图:

保证服务不中断的关键配置:

apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # 最多不可用Pod数
maxSurge: 1 # 最多超出副本数
template:
spec:
containers:
- name: web
image: nginx:1.21
ports:
- containerPort: 80
readinessProbe: # 就绪检查
httpGet:
path: /health
port: 80
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe: # 存活检查
httpGet:
path: /health
port: 80
initialDelaySeconds: 15
periodSeconds: 20
lifecycle:
preStop: # 优雅关闭
exec:
command: ["/bin/sh", "-c", "sleep 10"]

服务发现与网络类面试题

6. Service 的几种类型及其应用场景?

考察点: 服务暴露方式、网络理解

类型特点使用场景
ClusterIP集群内部访问内部服务通信
NodePort通过节点端口访问开发测试环境
LoadBalancer云厂商负载均衡器生产环境外部访问
ExternalNameDNS CNAME 记录外部服务映射

Service 工作原理:

7. Ingress 是什么?与 Service 有什么区别?

考察点: 七层负载均衡、流量路由

Ingress 架构图:

主要区别:

  • Service:四层负载均衡,基于 IP 和端口
  • Ingress:七层负载均衡,基于 HTTP/HTTPS,支持域名、路径路由

Ingress 配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
tls:
- hosts:
- app.example.com
secretName: tls-secret
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80

存储与配置类面试题

8. K8s 中的存储类型有哪些?PV、PVC、StorageClass 的关系?

考察点: 存储抽象、持久化理解

存储架构关系:

动态存储供应流程:

9. ConfigMap 和 Secret 的区别?如何在应用中使用?

考察点: 配置管理、安全性

特性ConfigMapSecret
用途非敏感配置敏感信息
存储方式明文Base64 编码
典型用例配置文件、环境变量密码、证书、Token
大小限制1MB1MB

使用方式示例:

# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
database.properties: |
db.host=mysql.default.svc.cluster.local
db.port=3306
db.name=myapp
log.level: "INFO"

---
# Secret
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
db.username: YWRtaW4= # admin (base64)
db.password: cGFzc3dvcmQ= # password (base64)

---
# Pod 使用配置
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: myapp:latest
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: log.level
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: app-secret
key: db.username
volumeMounts:
- name: config-volume
mountPath: /etc/config
- name: secret-volume
mountPath: /etc/secrets
volumes:
- name: config-volume
configMap:
name: app-config
- name: secret-volume
secret:
secretName: app-secret

调度与资源管理类面试题

10. K8s 的调度器是如何工作的?影响调度的因素有哪些?

考察点: 调度算法、资源分配

调度流程:

影响调度的关键因素:

  1. 资源需求和限制
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
  1. 节点选择器
nodeSelector:
disktype: ssd
  1. 亲和性和反亲和性
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: zone
operator: In
values:
- us-west-1a
- us-west-1b
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web
topologyKey: kubernetes.io/hostname

11. 什么是 Taint 和 Toleration?使用场景是什么?

考察点: 节点管理、工作负载隔离

Taint 和 Toleration 工作原理:

常见使用场景:

  1. 专用节点:GPU 节点只运行 AI/ML 工作负载
  2. 节点维护:标记节点进入维护模式
  3. 故障隔离:隔离有问题的节点
# 添加 Taint
kubectl taint nodes node1 gpu=true:NoSchedule

# Pod 添加 Toleration
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
tolerations:
- key: "gpu"
operator: "Equal"
value: "true"
effect: "NoSchedule"
containers:
- name: gpu-container
image: tensorflow/tensorflow:latest-gpu

监控与故障排查类面试题

12. K8s 集群中如何进行日志收集和监控?

考察点: 可观测性、运维能力

监控架构:

监控指标分类:

  1. 集群级指标

    • 节点资源使用率
    • 集群组件状态
    • API Server 性能
  2. 应用级指标

    • Pod CPU/内存使用
    • 容器重启次数
    • 应用自定义指标
  3. 业务级指标

    • 请求响应时间
    • 错误率
    • 吞吐量

13. 如何排查 Pod 启动失败的问题?

考察点: 故障排查能力、实际运维经验

Pod 故障排查流程:

常用排查命令:

# 查看 Pod 状态和事件
kubectl describe pod <pod-name>

# 查看 Pod 日志
kubectl logs <pod-name> [-c <container-name>]

# 查看前一个容器的日志
kubectl logs <pod-name> --previous

# 进入容器调试
kubectl exec -it <pod-name> -- /bin/bash

# 查看节点资源使用
kubectl top nodes
kubectl top pods

# 查看集群事件
kubectl get events --sort-by=.metadata.creationTimestamp

# 查看资源配额
kubectl describe quota
kubectl describe limitrange

高级特性类面试题

14. 什么是 Operator?如何开发一个简单的 Operator?

考察点: 高级概念、扩展能力

Operator 工作原理:

简单 Operator 示例(使用 Kubebuilder):

// api/v1/myapp_types.go
type MyAppSpec struct {
Replicas int32 `json:"replicas,omitempty"`
Image string `json:"image,omitempty"`
}

type MyAppStatus struct {
ReadyReplicas int32 `json:"readyReplicas,omitempty"`
}

// controllers/myapp_controller.go
func (r *MyAppReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
var myApp v1.MyApp
if err := r.Get(ctx, req.NamespacedName, &myApp); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}

// 创建或更新 Deployment
deployment := &appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: myApp.Name,
Namespace: myApp.Namespace,
},
Spec: appsv1.DeploymentSpec{
Replicas: &myApp.Spec.Replicas,
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{"app": myApp.Name},
},
Template: corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{"app": myApp.Name},
},
Spec: corev1.PodSpec{
Containers: []corev1.Container{
{
Name: "app",
Image: myApp.Spec.Image,
},
},
},
},
},
}

return ctrl.Result{}, r.CreateOrUpdate(ctx, deployment)
}

15. HPA、VPA、CA 分别是什么?如何配置自动扩缩容?

考察点: 弹性伸缩、资源优化

类型全称作用使用场景
HPAHorizontal Pod Autoscaler水平扩缩容(Pod 数量)应对流量变化
VPAVertical Pod Autoscaler垂直扩缩容(资源配置)优化资源配置
CACluster Autoscaler集群扩缩容(节点数量)节点资源不足

HPA 配置示例:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 50
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 60
policies:
- type: Percent
value: 100
periodSeconds: 60

自动扩缩容工作流程:

安全与权限类面试题

16. K8s 中的 RBAC 是什么?如何配置用户权限?

考察点: 安全机制、权限管理

RBAC 架构:

RBAC 配置示例:

# ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: app-service-account
namespace: default

---
# Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: app-role
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "list", "create", "update", "delete"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "create", "update"]

---
# RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: app-role-binding
namespace: default
subjects:
- kind: ServiceAccount
name: app-service-account
namespace: default
roleRef:
kind: Role
name: app-role
apiGroup: rbac.authorization.k8s.io

17. Pod 安全策略(PSP)和 Pod Security Standards 的作用?

考察点: 安全策略、最佳实践

Pod Security Standards 级别:

级别描述限制示例
Privileged不受限制允许特权容器、主机网络等
Baseline最小限制禁止特权容器、主机网络
Restricted严格限制必须以非 root 运行、只读根文件系统
# Namespace 配置 Pod Security Standards
apiVersion: v1
kind: Namespace
metadata:
name: secure-namespace
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted

---
# 安全的 Pod 配置
apiVersion: v1
kind: Pod
metadata:
name: secure-pod
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 2000
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: nginx:1.20
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
capabilities:
drop:
- ALL
resources:
limits:
memory: "128Mi"
cpu: "100m"
requests:
memory: "64Mi"
cpu: "50m"

实战场景类面试题

18. 如何在 K8s 中实现蓝绿部署和金丝雀发布?

考察点: 部署策略、流量管理

蓝绿部署流程:

金丝雀发布实现(使用 Istio):

# VirtualService 配置流量分配
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: app-vs
spec:
http:
- match:
- headers:
canary:
exact: "true"
route:
- destination:
host: app-service
subset: v2
- route:
- destination:
host: app-service
subset: v1
weight: 90
- destination:
host: app-service
subset: v2
weight: 10

---
# DestinationRule 定义版本子集
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: app-dr
spec:
host: app-service
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2

19. 大规模 K8s 集群的性能优化策略有哪些?

考察点: 性能调优、大规模运维

优化策略总览:

具体优化措施:

  1. etcd 优化
# etcd 参数调优
--quota-backend-bytes=8589934592 # 8GB
--max-request-bytes=33554432 # 32MB
--grpc-keepalive-min-time=30s
--grpc-keepalive-interval=60s
--grpc-keepalive-timeout=20s
  1. API Server 优化
# API Server 参数
--max-requests-inflight=400
--max-mutating-requests-inflight=200
--target-ram-mb=4096
--enable-priority-and-fairness=true
  1. Kubelet 优化
# Kubelet 配置
--max-pods=110
--kube-api-qps=50
--kube-api-burst=100
--serialize-image-pulls=false
--registry-qps=10
--registry-burst=20

20. 如何设计 K8s 多租户架构?

考察点: 架构设计、安全隔离

多租户架构方案:

租户隔离配置示例:

# 租户命名空间
apiVersion: v1
kind: Namespace
metadata:
name: tenant-a
labels:
tenant: tenant-a

---
# 资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
name: tenant-a-quota
namespace: tenant-a
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
pods: "10"
services: "5"

---
# 网络策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant-a-netpol
namespace: tenant-a
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
tenant: tenant-a
egress:
- to:
- namespaceSelector:
matchLabels:
tenant: tenant-a
- to: []
ports:
- protocol: UDP
port: 53